package com.example.theoretical_verification.string;

// 验证stringBuffer是线程不安全的
public class StringBufferThreadSafety {
    public static void main(String[] args) {
        long startTime = System.nanoTime();
        // 创建一个共享的 StringBuffer 对象
        StringBuffer stringBuffer = new StringBuffer("");

        // 创建两个线程，分别向 StringBuffer 对象中添加字符串
        // Lambda表达式的提出主要是为了简化代码编写，并支持函数式编程风格。通过Lambda表达式，可以将代码中的匿名内部类和冗长的语法精简化，使得代码更加清晰和易于理解。
        Thread thread1 = new Thread(() -> {
            for (int i = 0; i < 1000; i++) {
                stringBuffer.append("A");
            }
        });

        Thread thread2 = new Thread(() -> {
            for (int i = 0; i < 1000; i++) {
                stringBuffer.append("B");
            }
        });

        // 启动线程
        thread1.start();
        thread2.start();

        // 等待两个线程执行完毕
        try {
            thread1.join();
            thread2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        long endTime = System.nanoTime();
        long elapsedTime = endTime - startTime;
        // 输出最终的结果
        System.out.println("方法执行耗时: " + elapsedTime + " 纳秒");
        System.out.println("StringBuffer length: " + stringBuffer.length());
        assert stringBuffer.length() == 2000:"长度如果不是为2000那就是发生了线程安全问题";
    }
}
